home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
comm
/
tcp
/
Amster.lha
/
Amster_Install
/
Source
/
url.c
< prev
Wrap
C/C++ Source or Header
|
2000-05-13
|
4KB
|
150 lines
/*
** Clickable URL Class
*/
#include "include/config.h"
#include <string.h>
#include "include/mui.h"
#include <proto/graphics.h>
#include <proto/openurl.h>
#include "include/url.h"
struct Library *OpenURLBase;
ULONG url_new(struct IClass *cl, Object *obj, struct opSet *msg);
ULONG url_setup(struct IClass *cl, Object *obj, Msg msg);
ULONG url_minmax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg);
ULONG url_draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg);
ULONG url_cleanup(struct IClass *cl, Object *obj, Msg msg);
ULONG url_clicked(struct IClass *cl, Object *obj, Msg msg);
MUIF url_dispatch(REG(a0) struct IClass *cl,REG(a2) Object *obj,REG(a1) Msg msg)
{
switch(msg->MethodID) {
case OM_NEW: return(url_new(cl,obj,(APTR)msg));
case MUIM_Setup: return(url_setup(cl,obj,(APTR)msg));
case MUIM_AskMinMax: return(url_minmax(cl,obj,(APTR)msg));
case MUIM_Draw: return(url_draw(cl,obj,(APTR)msg));
case MUIM_Cleanup: return(url_cleanup(cl,obj,(APTR)msg));
case URL_CLICKED: return(url_clicked(cl,obj,(APTR)msg));
}
return(DoSuperMethodA(cl,obj,msg));
}
ULONG url_new(struct IClass *cl, Object *obj, struct opSet *msg)
{
struct urldata *data;
char *name, *href;
/* char *help;*/
name = (char *)GetTagData(URL_NAME,0,msg->ops_AttrList);
href = (char *)GetTagData(URL_HREF,0,msg->ops_AttrList);
/* help = (char *)GetTagData(URL_HELP,0,msg->ops_AttrList);*/
obj = (Object *)DoSuperNew(cl,obj,
MUIA_Font, MUIV_Font_Button,
MUIA_ShowSelState, FALSE,
MUIA_InputMode, MUIV_InputMode_RelVerify,
/* MUIA_ShortHelp, help, */
TAG_MORE, msg->ops_AttrList);
if(!obj) return(NULL);
data = INST_DATA(cl,obj);
data->name = name;
data->href = href;
data->len = strlen(name);
data->color = -1;
DoMethod(obj,MUIM_Notify,MUIA_Pressed,FALSE,obj,1,URL_CLICKED);
return((ULONG)obj);
}
ULONG url_setup(struct IClass *cl, Object *obj, Msg msg)
{
struct urldata *data = INST_DATA(cl,obj);
if (!DoSuperMethodA(cl,obj,msg))
return(FALSE);
data->color = ObtainBestPen(_screen(obj)->ViewPort.ColorMap,0,0,0,OBP_Precision,PRECISION_GUI,TAG_DONE);
return(TRUE);
}
ULONG url_minmax(struct IClass *cl, Object *obj, struct MUIP_AskMinMax *msg)
{
struct urldata *data = INST_DATA(cl,obj);
int x,y;
DoSuperMethodA(cl,obj,(APTR)msg);
x = _font(obj)->tf_XSize * data->len;
y = _font(obj)->tf_YSize;
msg->MinMaxInfo->MinWidth += x;
msg->MinMaxInfo->DefWidth += x + (x/10);
msg->MinMaxInfo->MaxWidth += MUI_MAXMAX;
msg->MinMaxInfo->MinHeight += y;
msg->MinMaxInfo->DefHeight += y;
msg->MinMaxInfo->MaxHeight += y;
return(0);
}
ULONG url_draw(struct IClass *cl, Object *obj, struct MUIP_Draw *msg)
{
struct urldata *data = INST_DATA(cl,obj);
int x,y,i;
DoSuperMethodA(cl,obj,(APTR)msg);
if(!(msg->flags & MADF_DRAWOBJECT)) return(0);
SetFont(_rp(obj),_font(obj));
if(!data->pixlen) data->pixlen=TextLength(_rp(obj),data->name,data->len);
x = _mleft(obj) + ( (_mwidth(obj) - data->pixlen) / 2);
y = _mtop(obj) + _font(obj)->tf_Baseline + ( (_mheight(obj) - _font(obj)->tf_YSize) / 2 );
Move(_rp(obj),x,y);
if(data->color != -1) SetAPen(_rp(obj),data->color); else SetAPen(_rp(obj),1);
Text(_rp(obj),data->name,data->len);
for (i=x; i<=x+data->pixlen; i+=4) {
Move(_rp(obj), i, y+3);
Draw(_rp(obj), i+1, y+3);
}
return(0);
}
ULONG url_cleanup(struct IClass *cl, Object *obj, Msg msg)
{
struct urldata *data = INST_DATA(cl,obj);
if(data->color != -1) ReleasePen(_screen(obj)->ViewPort.ColorMap,data->color);
return(DoSuperMethodA(cl,obj,msg));
}
ULONG url_clicked(struct IClass *cl, Object *obj, Msg msg)
{
struct urldata *data = INST_DATA(cl,obj);
OpenURLBase = OpenLibrary("openurl.library", 1);
if (!OpenURLBase) return(0);
URL_Open(data->href, TAG_DONE);
CloseLibrary(OpenURLBase);
return(0);
}